home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / DOS / C / ASCFIL.ZIP / RECORD.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-01  |  5.6 KB  |  267 lines

  1. //*                             Record.Cpp
  2. //*
  3. //*    Record Class to provide Functions that handle an Ascii Non-delimited
  4. //*    file, field access, movement throughout the record, and inquiry
  5. //*    information.
  6. //*
  7. //**************************************************************************
  8.  
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include "record.h"
  12.  
  13. //*************************************************************************
  14. Record::Record(void)
  15. {
  16.     init();
  17. }
  18.  
  19. //*************************************************************************
  20.  
  21. Record::Record(char *fldFile)
  22. {
  23.     init();
  24.     char str[81];
  25.     FILE *fp = fopen(fldFile,"rt");
  26.         while(fgets(str,81,fp))
  27.         {
  28.         char *c = strchr(str,':');
  29.         if (!c)
  30.             continue;
  31.         *c=0;
  32.         addField(str,atoi(c+1));
  33.     }
  34.     fclose(fp);
  35. }
  36.  
  37. //*************************************************************************
  38.  
  39. void Record::init(void)
  40. {
  41.     fldCount            = 0;
  42.         fldArraySize                    = 0;
  43.     recLen                = 0;
  44.     Buffer                = NULL;
  45.     fields                = NULL;
  46. }
  47.  
  48. //*************************************************************************
  49.  
  50. Record::~Record(void)
  51. {
  52.         if (fields)
  53.         {
  54.                 for (int i=0; i<fldCount; i++)
  55.                 {
  56.             delete fields[i];
  57.                 }
  58.  
  59.             delete[] fields;
  60.         }
  61.  
  62.     if (Buffer)
  63.       delete Buffer;
  64. }
  65.  
  66.  
  67. //*************************************************************************
  68. int Record::addField(char *name, int width)
  69. {
  70.    if (fldCount==fldArraySize)
  71.    {
  72.         FieldDef  **tempfields = new FieldDef* [fldArraySize += 10];
  73.         if (fields)
  74.         {
  75.               for (int i=0; i<fldCount; i++)
  76.                     tempfields[i] = fields[i];
  77.               delete fields;
  78.         }
  79.           fields=tempfields;
  80.    }
  81.  
  82.     fields[fldCount++]= new FieldDef(name,width,recLen);
  83.     recLen += width;
  84.  
  85.      if (Buffer)
  86.             delete Buffer;
  87.      Buffer = new char[recLen+2];
  88.  
  89.   return TRUE;
  90. }
  91.  
  92. //*************************************************************************
  93.  
  94. int Record::Length(void)
  95. {
  96.     return recLen;
  97. }
  98.  
  99. //*************************************************************************
  100.  
  101. int Record::getFieldNum(char *name)
  102. {
  103.     for (int i=0; i<fldCount; i++)
  104.         if (!strcmp(name,fields[i]->Name))
  105.             return(i);
  106.  
  107.     return -1;
  108. }
  109.  
  110. //*************************************************************************
  111.  
  112. const char* Record::getFieldName(int fldNum)
  113. {
  114.     if (fldNum<0 || fldNum>=fldCount)
  115.         return FALSE;
  116.  
  117.     return fields[fldNum]->Name;
  118. }
  119.  
  120. //*************************************************************************
  121.  
  122. int Record::getField(int fldNum, char *field)
  123. {
  124.     if (fldNum<0 || fldNum>=fldCount)
  125.         return FALSE;
  126.  
  127.     memcpy(field,Buffer+fields[fldNum]->Offset,fields[fldNum]->Width);
  128.     field[fields[fldNum]->Width]=0;
  129.   return TRUE;
  130. }
  131.  
  132. //*************************************************************************
  133.  
  134. int Record::getField(char *name, char *field)
  135. {
  136.     int i = getFieldNum(name);
  137.     if (i>=0)
  138.         return(getField(i,field));
  139.  
  140.     return FALSE;
  141. }
  142.  
  143. //*************************************************************************
  144.  
  145. int Record::getField(int fldNum, int &field)
  146. {
  147.     if (fldNum<0 || fldNum>=fldCount)
  148.         return FALSE;
  149.  
  150.     char *fstr = new char[fields[fldNum]->Width+1];
  151.     getField(fldNum,fstr);
  152.     field=atoi(fstr);
  153.     delete fstr;
  154.  
  155.   return TRUE;
  156. }
  157.  
  158.  
  159. //*************************************************************************
  160.  
  161. int Record::getField(char *name, int &field)
  162. {
  163.     int i = getFieldNum(name);
  164.     if (i<0)
  165.         return FALSE;
  166.  
  167.     return(getField(i,field));
  168. }
  169.  
  170.  
  171. //*************************************************************************
  172.  
  173. int Record::getField(int fldNum, long &field)
  174. {
  175.     if (fldNum<0 || fldNum>=fldCount)
  176.         return FALSE;
  177.  
  178.     char *fstr = new char[fields[fldNum]->Width+1];
  179.     getField(fldNum,fstr);
  180.     field=atol(fstr);
  181.     delete fstr;
  182.  
  183.   return TRUE;
  184. }
  185.  
  186. //*************************************************************************
  187.  
  188. int Record::getField(char *name, long &field)
  189. {
  190.     int i = getFieldNum(name);
  191.     if (i<0)
  192.         return FALSE;
  193.  
  194.     return(getField(i,field));
  195. }
  196.  
  197. //*************************************************************************
  198.  
  199. int Record::getField(int fldNum, float &field)
  200. {
  201.     if (fldNum<0 || fldNum>=fldCount)
  202.         return FALSE;
  203.  
  204.     char *fstr = new char[fields[fldNum]->Width+1];
  205.     getField(fldNum,fstr);
  206.     field=(float)atof(fstr);
  207.     delete fstr;
  208.  
  209.   return TRUE;
  210. }
  211.  
  212. //*************************************************************************
  213. int Record::getField(char *name, float &field)
  214. {
  215.     int i = getFieldNum(name);
  216.     if (i<0)
  217.         return FALSE;
  218.  
  219.     return(getField(i,field));
  220. }
  221.  
  222. //*************************************************************************
  223.  
  224. int Record::getField(int fldNum, double &field)
  225. {
  226.     if (fldNum<0 || fldNum>=fldCount)
  227.         return FALSE;
  228.  
  229.     char *fstr = new char[fields[fldNum]->Width+1];
  230.     getField(fldNum,fstr);
  231.         field=(double)atof(fstr);
  232.     delete fstr;
  233.  
  234.   return TRUE;
  235. }
  236.  
  237. //*************************************************************************
  238. int Record::getField(char *name, double &field)
  239. {
  240.     int i = getFieldNum(name);
  241.     if (i<0)
  242.         return FALSE;
  243.  
  244.     return(getField(i,field));
  245. }
  246.  
  247. //*************************************************************************
  248.  
  249. int Record::getFieldWidth(int fldNum)
  250. {
  251.     if (fldNum<0 || fldNum>=fldCount)
  252.         return 0;
  253.  
  254.     return fields[fldNum]->Width;
  255. }
  256.  
  257. //*************************************************************************
  258.  
  259. int Record::getFieldWidth(char *name)
  260. {
  261.     int i = getFieldNum(name);
  262.     if (i>=0)
  263.         return(getFieldWidth(i));
  264.  
  265.     return 0;
  266. }
  267.